package com.linzm.leetcode.primary.exercises1_20230114;

import java.util.Arrays;
import java.util.TreeMap;

/**
 * @Author zimingl
 * @Date 2023/1/15 13:48
 * @Description: 差值数组不同的字符串
 * 】给你一个字符串数组 words ，每一个字符串长度都相同，令所有字符串的长度都为 n 。
 * 每个字符串 words[i] 可以被转化为一个长度为 n - 1 的 差值整数数组 difference[i] ，其中对于 0 <= j <= n - 2 有 difference[i][j] = words[i][j+1] - words[i][j] 。注意两个字母的差值定义为它们在字母表中 位置 之差，也就是说 'a' 的位置是 0 ，'b' 的位置是 1 ，'z' 的位置是 25 。
 * 比方说，字符串 "acb" 的差值整数数组是 [2 - 0, 1 - 2] = [2, -1] 。
 * words 中所有字符串 除了一个字符串以外 ，其他字符串的差值整数数组都相同。你需要找到那个不同的字符串。
 * 请你返回 words中 差值整数数组 不同的字符串。
 *
 * 做法： 假设第一个是唯一不同的，则map长度不是1，直接返回第一个，反之
 */
public class Demo15_2451 {
    /**
     * 输入：words = ["adc","wzy","abc"]
     * 输出："abc"
     * 解释：
     * - "adc" 的差值整数数组是 [3 - 0, 2 - 3] = [3, -1] 。
     * - "wzy" 的差值整数数组是 [25 - 22, 24 - 25]= [3, -1] 。
     * - "abc" 的差值整数数组是 [1 - 0, 2 - 1] = [1, 1] 。
     * 不同的数组是 [1, 1]，所以返回对应的字符串，"abc"。
     */
    public static void main(String[] args) {
        String[] words = { "abc","adc", "wzy"};
        Demo15_2451 demo15_24511 = new Demo15_2451();
        String oddString = demo15_24511.oddString(words);
        System.out.println(oddString);
    }

    private String oddString(String[] words) {
        int len = words[0].length(), arrIndex = 0;
        TreeMap<Integer, int[]> map = new TreeMap<>();
        int[] arr = null;
        for (int i = 0; i < words.length; ++i) {
            String word = words[i];
            int index = 0;
            int[] nums = new int[len - 1];
            for (int j = len - 1; j >= 1; --j) {
                nums[index++] = word.charAt(j) - word.charAt(j - 1);
            }
            if (arr == null) {
                arr = Arrays.copyOf(nums, len - 1);
            }
            if (!isSame(arr, nums)) {
                map.put(i, nums);
            }
        }
        if (map.size() == 1) {
            Integer key = map.firstEntry().getKey();
            return words[key];
        } else {
            return words[arrIndex];
        }
    }

    private boolean isSame(int[] nums1, int[] nums2) {
        for (int i = 0; i < nums1.length; ++i) {
            if (nums1[i] != nums2[i]) {
                return false;
            }
        }
        return true;
    }

    public String oddString2(String[] words) {
        /*
        枚举
         */
        int n = words[0].length();
        // 枚举位置
        for (int i = 1; i < n; i++) {
            int[] cntMap = new int[51]; // 范围:[-25,25]
            // 枚举每个字符串该位置的差值
            for (String word : words) {
                cntMap[word.charAt(i) - word.charAt(i - 1) + 25]++;
            }
            // 计算不一样的位出现在哪个字符串
            for (int k = 0; k < 51; k++) {
                if (cntMap[k] == 1) {
                    for (String word : words) {
                        if (word.charAt(i) - word.charAt(i - 1) + 25 == k) {
                            return word;
                        }
                    }
                }
            }
        }
        return "";
    }
}
